Introduce page_list_move()
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 18 Jun 2009 09:30:28 +0000 (10:30 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 18 Jun 2009 09:30:28 +0000 (10:30 +0100)
This not only allows to remove ia64's special implementation of
page_list_splice_init(), but also fixes the latent issue with the
direct list head assignment in the x86 code if that would ever get
switched back to using normal list entries for linking together pages
(i.e. whenever x86-64 is to support more tha 16Tb of memory).

Signed-off-by: Jan Beulich <jbeulich@novell.com>
xen/arch/ia64/xen/domain.c
xen/arch/x86/domain.c
xen/include/asm-ia64/mm.h
xen/include/xen/mm.h

index f69fdb820a81de219de6648af5c9a137c5a61451..bdc31323c9b0c05b1b286981149ade39fc551f3b 100644 (file)
@@ -1705,7 +1705,7 @@ static int relinquish_memory(struct domain *d, struct page_list_head *list)
         }
     }
 
-    page_list_splice_init(&d->arch.relmem_list, list);
+    page_list_move(list, &d->arch.relmem_list);
 
  out:
     spin_unlock_recursive(&d->page_alloc_lock);
index 201c9eb4570db0bb9c0f3a98d4e9ca4cc931033b..48b41a2bdaa64e1f0ab973c6bb751cdf7c68936a 100644 (file)
@@ -1818,11 +1818,7 @@ static int relinquish_memory(
     }
 
     /* list is empty at this point. */
-    if ( !page_list_empty(&d->arch.relmem_list) )
-    {
-        *list = d->arch.relmem_list;
-        INIT_PAGE_LIST_HEAD(&d->arch.relmem_list);
-    }
+    page_list_move(list, &d->arch.relmem_list);
 
  out:
     spin_unlock_recursive(&d->page_alloc_lock);
index e8803ba9b1a1175dba65f09229a73bdc2a8eb932..a94264615cf2f185f51729a86f0dfb92cbc5432d 100644 (file)
@@ -92,24 +92,6 @@ struct page_info
     u32 tlbflush_timestamp;
 };
 
-#ifndef page_list_entry
-static inline void
-page_list_splice_init(struct page_list_head *list, struct page_list_head *head)
-{
-    if ( !page_list_empty(list) )
-    {
-        if ( head->next )
-            head->tail->list.next = page_to_mfn(list->next);
-        else
-            head->next = list->next;
-        head->tail = list->tail;
-        INIT_PAGE_LIST_HEAD(list);
-    }
-}
-#else
-# define page_list_splice_init list_splice_init
-#endif
-
 #define set_page_count(p,v)    atomic_set(&(p)->_count, v - 1)
 
 /*
index 50c47b00e2acf0c88bbb141b91dc5d4ca9ccbe32..71e3181e2a4f1ec36286f03399b90d02337c2bc4 100644 (file)
@@ -223,7 +223,15 @@ page_list_remove_head(struct page_list_head *head)
 
     return page;
 }
-
+static inline void
+page_list_move(struct page_list_head *dst, struct page_list_head *src)
+{
+    if ( !page_list_empty(src) )
+    {
+        *dst = *src;
+        INIT_PAGE_LIST_HEAD(src);
+    }
+}
 static inline void
 page_list_splice(struct page_list_head *list, struct page_list_head *head)
 {
@@ -281,6 +289,8 @@ page_list_splice(struct page_list_head *list, struct page_list_head *head)
         list_del(&__pg->list); \
         __pg; \
     }) : NULL)
+# define page_list_move(dst, src)        (!list_empty(src) ? \
+    list_replace_init(src, dst) : (void)0)
 # define page_list_for_each(pos, head)   list_for_each_entry(pos, head, list)
 # define page_list_for_each_safe(pos, tmp, head) \
     list_for_each_entry_safe(pos, tmp, head, list)